package com.ylesb.aop;
/**
 * @title: LogAspect
 * @projectName springdemo
 * @description: TODO
 * @author White
 * @site : [www.ylesb.com]
 * @date 2022/7/715:28
 */

import com.sun.org.apache.regexp.internal.RE;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.logging.Logger;

/**
 * @className    : LogAspect
 * @description  : [描述说明该类的功能]  
 * @author       : [XuGuangchao]
 * @site         : [www.ylesb.com]
 * @version      : [v1.0]
 * @createTime   : [2022/7/7 15:28]
 * @updateUser   : [XuGuangchao]
 * @updateTime   : [2022/7/7 15:28]
 * @updateRemark : [描述说明本次修改内容] 
 */
@Component
@Aspect
public class LogAspect {

/**
 *可以统一定义切点
 */
    //@Pointcut("@annotation(Action)")
    //public void pointcut() {}//下面引入pointcut()方法就可以了
    /**
     *可以统一定义切点
     *第一个 * 表示要拦截的目标方法返回值任意（也可以明确指定返回值类型
     *第二个 * 表示包中的任意类（也可以明确指定类
     *第三个 * 表示类中的任意方法
     *最后面的两个点表示方法参数任意，个数任意，类型任意
     */
    @Pointcut("execution(* com.ylesb.aop.service.*.*(..))")
    public void pointcut() {}
    @Before("@annotation(Action)")
    //前置通知
    public void before(JoinPoint joinPoint){
        String name = joinPoint.getSignature().getName();
        System.out.println(name+"前方法执行了");
    }
    @After("@annotation(Action)")
    //后置通知
    public void after(JoinPoint joinPoint){
        String name = joinPoint.getSignature().getName();
        System.out.println(name+"后方法执行了");
    }
    @AfterReturning(value = "@annotation(Action)",returning = "r")//要与下面方法的参数一致
    //返回通知，获取返回的结果  注解的方法有返回值类型一致才有返回通知
    public void returning(JoinPoint joinPoint,Integer r){
        String name = joinPoint.getSignature().getName();
        System.out.println(name+"返回通知"+r);
    }
    @AfterThrowing(value = "@annotation(Action)",throwing = "e")//要与下面方法的参数一致
    //异常通知，获取返回的结果  注解的方法有异常类型才有返回通知
    public void afterThrowing(JoinPoint joinPoint,Exception e){
        String name = joinPoint.getSignature().getName();
        System.out.println(name+"抛出异常"+e.getMessage());
    }
    @Around("@annotation(Action)")//要与下面方法的参数一致
    //环绕通知，获取返回的结果  注解的方法有异常类型才有返回通知
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object result = joinPoint. proceed(new Object[]{1,2});//强制修改数据
        return result;
    }
}
